/**
 *  \file   relay.c
 *  \brief  Fonctions relatives aux températures reçues par un noeud et qu'il devra relayer par la suite : stockage, traitement, etc.
 *  \author Miora ANDRIAMANOHARISOA, Loic MINGHETTI
 *  \date   PFE 2011
 **/

#include "include.h"

#define NUM_PT_TEMPERATURE_RELAY 10
/* tableau contenant les 10 dernières température reçues et qui n'ont pas encore été relayée par le noeud */
tmp_to_relay temperature_to_relay_array[NUM_PT_TEMPERATURE_RELAY];

void temperature_init(tmp_to_relay tmp) {
    tmp.origine_id = BROADCAST;
    tmp.sender_id = BROADCAST;
    tmp.num_mesure = 0;
    tmp.temperature = 0;
}

/* retourne 0 si tmp correspond à une valeur initiale par défaut, sinon retourne 1 */
int value_is_init(tmp_to_relay tmp) {
  if ((tmp.origine_id == BROADCAST) && (tmp.sender_id == BROADCAST) && (tmp.temperature == 0) && (tmp.num_mesure == 0)) {
    return 0;
  } else {
    return 1;
  }
}

void init_temperature_to_relay_array(void) {
  int i;
  i=0;
  for(i=0; i < (NUM_PT_TEMPERATURE_RELAY - 1); i++){
    temperature_init(temperature_to_relay_array[i]);
  }
}

/* ajoute une nouvelle température reçue à la fin du tableau de stockage */
void add_temperature_to_relay(int origine, int sender, int tmp, int num_mesure) {
   int i;
   i=0;
   while ((value_is_init(temperature_to_relay_array[i]) == 1) && (i < NUM_PT_TEMPERATURE_RELAY)) {
     i++;
   } 
   if (i == (NUM_PT_TEMPERATURE_RELAY - 1) ) {
     printf("[RCV] tableau rempli, température rejetée\r\n");
   }
   else {
     temperature_to_relay_array[i].origine_id = origine;
     temperature_to_relay_array[i].sender_id = sender;
     temperature_to_relay_array[i].temperature = tmp;
     temperature_to_relay_array[i].num_mesure = num_mesure;
   }
}

/* retourne la première température du tableau de stockage des températures à relayer : cad la première valeur reçue, soit la plus vieille */
tmp_to_relay get_temperature_to_relay() {
  tmp_to_relay value;
  value = temperature_to_relay_array[0]; 
  int i;
  i = 0;
  for( i=0; i < NUM_PT_TEMPERATURE_RELAY - 2; i++) {
    temperature_to_relay_array[i] = temperature_to_relay_array[i+1];
  }
  temperature_init(temperature_to_relay_array[NUM_PT_TEMPERATURE_RELAY-1]);
  return value;
}

/* retourne 0 s'il n'y a aucune température à relayer, 1 sinon */
int check_temperature_to_relay_array(void) {
  if (value_is_init(temperature_to_relay_array[0]) == 0) {
    return 0;
  } else return 1;
}

void affiche_temperature_to_relay_array(void) {
  int i;
  i=0;
  printf("\r\n****** TEMPERATURE A RELAYER *********\r\n");
  for(i=0; i < NUM_PT_TEMPERATURE_RELAY ; i++){
    if (value_is_init(temperature_to_relay_array[i]) == 1) {
      printf("temperature[%d] : [origine %d, sender %d, temp %d, numero de mesure %d]\r\n", i, temperature_to_relay_array[i].origine_id, temperature_to_relay_array[i].sender_id, temperature_to_relay_array[i].temperature, temperature_to_relay_array[i].num_mesure);
    }
  }
  printf("\r\n");
}
